/*
 *  PPXMLEntityDescription.m
 *  PigeonsFoundation
 *
 *  Created by Jacob Basham on 2/2/07.
 *  Copyright 2007, PaperPigeons.net
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions 
 *  are met:
 *  1. Redistributions of source code must retain the above copyright 
 *     notice, this list of conditions and the following disclaimer.
 *	2. Redistributions in binary form must reproduce the above copyright 
 *	   notice, this list of conditions and the following disclaimer in 
 *	   the documentation and/or other materials provided with the distribution.
 *	3. Neither the name of PaperPigeons.net nor the names of its contributors 
 *	   may be used to endorse or promote products derived from this software 
 *	   without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 *	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 *	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 *	FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 *	COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 *	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 *	BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 *	CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 *	LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 *	IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 *	POSSIBILITY OF SUCH DAMAGE.
 */

#import "PPXMLEntityDescription.h"


@implementation PPXMLEntityDescription

+ (id)entityDescriptionWithContentsOfFile:(NSString *)path
{
	id this;
	NSDictionary * temp = [[NSDictionary alloc] initWithContentsOfFile:path];
	if ([[temp valueForKey:@"type"] isEqualToString:[[self class] description]]) {
		this = [[self alloc] init];
		[this addEntriesFromDictionary:temp];
	}
	return this;
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
+ (id)entityDescriptionWithName:(NSString *)name 
		parent:(PPXMLEntityDescription *)parent
{
	id this = [[self alloc] initWithName:name];
	[this setParent:parent];
	return this;
}

/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (id)initWithName:(NSString *)name
{
	if (self = [super init]) {
		[self setValue:name forKey:@"entityName"];
		[self setValue:[[self class] description] forKey:@"type"];
		[self setValue:[NSMutableArray array] forKey:@"children"];
		[self setValue:[NSMutableArray array] forKey:@"attributes"];
		[self setValue:[NSMutableArray array] forKey:@"characterNodes"];
	}
	return self;
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (NSString *)name
{
	return [self valueForKey:@"entityName"];
}


- (void)setParent:(PPXMLEntityDescription *)parent
{
	if ([parent class] == [PPXMLEntityDescription class]) {
		[super setParent:parent];
	} else {
		// TODO throw exception
	}
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (void)addAttribute:(NSString *)node
{
	[[self valueForKey:@"attributes"] addObject:node];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (void)addCharacterNode:(NSString *)node
{
	[[self valueForKey:@"characterNodes"] addObject:node];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (void)addChildNode:(PPXMLEntityDescription *)node
{
	[[self valueForKey:@"children"] addObject:node];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (NSArray *)children
{
	return [self valueForKey:@"children"];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (NSArray *)attributes
{
	return [self valueForKey:@"attributes"];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (NSArray *)characterNodes
{
	return [self valueForKey:@"characterNodes"];
}


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (NSError *)writeEntityDescriptionToFile:(NSString *)path
{
	return nil;
}

@end
